package cn.xzqwjw.taskmanager.utils;

import cn.hutool.core.util.ArrayUtil;

import java.math.BigInteger;
import java.util.*;

/**
 * 自定义的字符串相关工具类
 *
 * @author rush
 */
public class MyStringUtil {

  /**
   * 随机生成字符串
   */
  public static String getRandomString(int length) {
    String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    Random random = new Random();
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < length; i++) {
      sb.append(str.charAt(random.nextInt(str.length())));
    }
    return sb.toString();
  }

  /**
   * 随机生成字符串，并且指定字符串的某个位置是什么范围的值
   */
  public static String getRandomString2(int length) {
    Random random = new Random();
    StringBuilder sb = new StringBuilder();
    int number;
    long result;
    for (int i = 0; i < length; i++) {
      switch (random.nextInt(3)) {
        case 0:
          result = Math.round(Math.random() * 25 + 65);
          break;
        case 1:
          result = Math.round(Math.random() * 25 + 97);
          break;
        case 2:
          result = new Random().nextInt(10);
          break;
        default:
          result = 0;
      }
      sb.append((char) result);
    }
    return sb.toString();
  }

  /**
   * 利用UUID生成随机字符串
   * UUID是一组由16进制数字所构成32位长度的字符串
   * 本方法生成的字符串常用于设置上传文件保存在数据库中的文件UUID
   */
  public static String getUuid() {
    // replace 的参数是 char 和 CharSequence ，即可以支持字符的替换，也支持字符串的替换
    // CharSequence 即字符串序列的意思，说白了也是字符串
    // replaceAll 的参数是 regex，即基于规则表达式的替换
    // 比如，可以通过 replaceAll("\d"， "*") 把一个字符串所有的数字字符都换成星号
    return UUID.randomUUID().toString().replace("-", "");
    // return UUID.randomUUID().toString().replaceAll("-", "");
  }

  /**
   * UUID生成36位纯数字ID
   */
  public static String getUuidNum() {
    // 第一种方式
    return new BigInteger(getUuid(), 16).toString(36);
    // 第二种方式
    // int orderId = UUID.randomUUID().toString().hashCode();
    // String.hashCode() 值会为负，因此要做一步转正操作
    // return orderId < 0 ? -orderId : orderId;
  }

  /**
   * 根据 separator 生成类似“2021-01-03”格式的字符串
   * 如果 separator = "" 则生成 “20210103”格式的字符串
   * 用于设置上传到服务器的文件的文件名前缀
   *
   * @param separator 分隔符
   * @param flagTime  是否包括时间
   * @param flagMS    是否包括毫秒
   */
  public static String getFileNameByDate(String separator, Boolean flagTime, Boolean flagMS) {
    Date now = new Date();
    String yearString = DateTimeUtil.getYearString(now);
    String monthString = DateTimeUtil.getMonthString(now);
    String dayString = DateTimeUtil.getDayString(now);
    String result = yearString + separator + monthString + separator + dayString;
    if (flagTime) {
      String hourString = DateTimeUtil.getHourString(now);
      String minuteString = DateTimeUtil.getMinuteString(now);
      String secondString = DateTimeUtil.getSecondString(now);
      result += separator + hourString + separator + minuteString + separator + secondString;
      if (flagMS) {
        String milliSecondString = DateTimeUtil.getMilliSecondString(now);
        result += separator + milliSecondString;
      }
    }
    return result;
  }

  /**
   * 去除字符串数组中的空值
   */
  public static String[] clearEmptyValue(String[] source) {
    if (source == null || source.length == 0) {
      return null;
    }
    List<String> list = new ArrayList<>();
    for (String str : source) {
      // 删除头尾空白
      if (!str.trim().isEmpty()) {
        list.add(str);
      }
    }
    return list.toArray(new String[0]);
  }

}
